/*

std::packaged_task是一个可调用目标，它包装了一个任务，该任务可以在另一个线程上运行。它可以捕获任务的返回值或异常，并将其存储在std::future对象中，以便以后使用。

std::future代表一个异步操作的结果。它可以用于从异步任务中获取返回值或异常。

*/

#include <iostream>
#include <future>
#include <chrono>
#include <thread>

void use_package()
{
    int data = 42;
    // 创建一个包装了人物的 std::packaged_task对象
    std::packaged_task<int()> task([=]()
                                   {
        std::this_thread::sleep_for(std::chrono::seconds(5));
        std::cout << "my task run 5 s" << std::endl;
        return data; });

    // 获取与人物关联的 std::future 对象
    // 此时任务尚未启动
    std::future<int> result = task.get_future();
    std::cout << "main thread 获取了 result" << std::endl;
    // 在另一个线程上去执行
    std::thread t(std::move(task));
    t.detach(); // 与主线程分离，各干各的

    // 等待人物完成并获取结果
    int value = result.get();
    std::cout << "result is: " << value << std::endl;
}

int main()
{
    use_package();
    return 0;
}

/*

创建一个std::packaged_task对象，该对象包装了要执行的任务。
调用std::packaged_task对象的get_future()方法，该方法返回一个与任务关联的std::future对象。
在另一个线程上调用std::packaged_task对象的operator()，以执行任务。
在需要任务结果的地方，调用与任务关联的std::future对象的get()方法，以获取任务的返回值或异常。

*/